package com.shujia.spark.sql

import org.apache.spark.sql.{DataFrame, SparkSession}

object Demo9SparkSqlOnHIve {
  def main(args: Array[String]): Unit = {
    /**
     * spark 整合hive 需要开启hive的元数据服务
     * 3、spark-sql
     *  spark-sql --master yarn-client   不能使用yarn-cluster
     *
     *
     *  可以整合hive  使用hive的元数据
     *  开启hive元数据服务的目的是让spark sql 可以获取到hive的元数据
     *  1、在hive的hive-site.xml修改一行配置，增加了这一行配置之后，以后在使用hive之前都需要先启动元数据服务
     *  <property>
     *  <name>hive.metastore.uris</name>
     *  <value>thrift://master:9083</value>
     *  </property>
     *
     *  2启动hive元数据服务
     *
     *  nohup  hive --service metastore >> metastore.log 2>&1 &
     *
     *  验证hive是否可用
     *
     *  3、将hive-site.xml  复制到spark conf目录下
     *  cp hive-site.xml /usr/local/soft/spark-2.4.5/conf/
     *
     *  4、 将mysql 驱动包复制到spark jars目录下
     *  cp mysql-connector-java-5.1.17.jar /usr/local/soft/spark-2.4.5/jars/
     *
     *  整合好之后在spark-sql 里面就可以使用hive的表了
     *  spark-sql --master yarn-client  --conf  spark.sql.shuffle.partitions=2
     *  不能使用cluster模式
     *
     *  在spark-sql中设置运行参数
     *  set spark.sql.shuffle.partitions=2;
     *
     *
     */

    val spark: SparkSession = SparkSession
      .builder()
      .appName("onhive")
      .enableHiveSupport() //开启hvie元数据支持, 开启之后在spark的代码中可以直接读取hive的元数据
      .getOrCreate()

    //可以直接写sql， 使用hive中已经有的表
    spark.sql(
      """
        |select clazz,count(1) from student group by clazz
        |
        |""".stripMargin)
      .show()

    //也可以将hive中已存在的表转换成一个DF
    val df: DataFrame = spark.table("shujia.data_order")

    df.show()

    /**
     * 将代码打包上传到服务器中运行
     * spark-submit --master yarn-client --class com.shujia.spark.sql.Demo9SparkSqlOnHIve --conf spark.sql.shuffle.partitions=1 spark-1.0-SNAPSHOT.jar
     */
  }

}
